home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / font / CMap.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  4.9 KB  |  268 lines

  1. package sun.font;
  2.  
  3. import java.nio.ByteBuffer;
  4. import java.nio.CharBuffer;
  5. import java.nio.charset.Charset;
  6. import java.nio.charset.CodingErrorAction;
  7.  
  8. abstract class CMap {
  9.    static final short ShiftJISEncoding = 2;
  10.    static final short GBKEncoding = 3;
  11.    static final short Big5Encoding = 4;
  12.    static final short WansungEncoding = 5;
  13.    static final short JohabEncoding = 6;
  14.    static final short MSUnicodeSurrogateEncoding = 10;
  15.    static final char noSuchChar = 'ÔøΩ';
  16.    static final int SHORTMASK = 65535;
  17.    static final int INTMASK = -1;
  18.    static final char[][] converterMaps = new char[7][];
  19.    char[] xlat;
  20.    public static final NullCMapClass theNullCmap = new NullCMapClass();
  21.  
  22.    static CMap initialize(TrueTypeFont var0) {
  23.       CMap var1 = null;
  24.       short var4 = -1;
  25.       int var5 = 0;
  26.       int var6 = 0;
  27.       int var7 = 0;
  28.       int var8 = 0;
  29.       int var9 = 0;
  30.       int var10 = 0;
  31.       int var11 = 0;
  32.       int var12 = 0;
  33.       boolean var13 = false;
  34.       ByteBuffer var14 = var0.getTableBuffer(1668112752);
  35.       int var15 = var0.getTableSize(1668112752);
  36.       short var16 = var14.getShort(2);
  37.  
  38.       for(int var17 = 0; var17 < var16; ++var17) {
  39.          var14.position(var17 * 8 + 4);
  40.          short var3 = var14.getShort();
  41.          if (var3 == 3) {
  42.             var13 = true;
  43.             var4 = var14.getShort();
  44.             int var2 = var14.getInt();
  45.             switch (var4) {
  46.                case 0:
  47.                   var5 = var2;
  48.                   break;
  49.                case 1:
  50.                   var6 = var2;
  51.                   break;
  52.                case 2:
  53.                   var7 = var2;
  54.                   break;
  55.                case 3:
  56.                   var8 = var2;
  57.                   break;
  58.                case 4:
  59.                   var9 = var2;
  60.                   break;
  61.                case 5:
  62.                   var10 = var2;
  63.                   break;
  64.                case 6:
  65.                   var11 = var2;
  66.                case 7:
  67.                case 8:
  68.                case 9:
  69.                default:
  70.                   break;
  71.                case 10:
  72.                   var12 = var2;
  73.             }
  74.          }
  75.       }
  76.  
  77.       if (var13) {
  78.          if (var12 != 0) {
  79.             var1 = createCMap(var14, var12, (char[])null);
  80.          } else if (var5 != 0) {
  81.             var1 = createCMap(var14, var5, (char[])null);
  82.          } else if (var6 != 0) {
  83.             var1 = createCMap(var14, var6, (char[])null);
  84.          } else if (var7 != 0) {
  85.             var1 = createCMap(var14, var7, getConverterMap((short)2));
  86.          } else if (var8 != 0) {
  87.             var1 = createCMap(var14, var8, getConverterMap((short)3));
  88.          } else if (var9 != 0) {
  89.             if (!FontManager.isSolaris || var0.platName == null || !var0.platName.startsWith("/usr/openwin/lib/locale/zh_CN.EUC/X11/fonts/TrueType") && !var0.platName.startsWith("/usr/openwin/lib/locale/zh_CN/X11/fonts/TrueType") && !var0.platName.startsWith("/usr/openwin/lib/locale/zh/X11/fonts/TrueType")) {
  90.                var1 = createCMap(var14, var9, getConverterMap((short)4));
  91.             } else {
  92.                var1 = createCMap(var14, var9, getConverterMap((short)3));
  93.             }
  94.          } else if (var10 != 0) {
  95.             var1 = createCMap(var14, var10, getConverterMap((short)5));
  96.          } else if (var11 != 0) {
  97.             var1 = createCMap(var14, var11, getConverterMap((short)6));
  98.          }
  99.       } else {
  100.          var1 = createCMap(var14, var14.getInt(8), (char[])null);
  101.       }
  102.  
  103.       return var1;
  104.    }
  105.  
  106.    static char[] getConverter(short var0) {
  107.       char var1 = 'ËÄÄ';
  108.       char var2 = '\uffff';
  109.       String var3;
  110.       switch (var0) {
  111.          case 2:
  112.             var1 = 'ËÖÄ';
  113.             var2 = 'Ô≥º';
  114.             var3 = "SJIS";
  115.             break;
  116.          case 3:
  117.             var1 = 'ËÖÄ';
  118.             var2 = 'Ô∫†';
  119.             var3 = "GBK";
  120.             break;
  121.          case 4:
  122.             var1 = 'ÍÖÄ';
  123.             var2 = '\ufefe';
  124.             var3 = "Big5";
  125.             break;
  126.          case 5:
  127.             var1 = 'Íܰ';
  128.             var2 = 'Ôªû';
  129.             var3 = "EUC_KR";
  130.             break;
  131.          case 6:
  132.             var1 = 'ËÖÅ';
  133.             var2 = 'Ô∑æ';
  134.             var3 = "Johab";
  135.             break;
  136.          default:
  137.             return null;
  138.       }
  139.  
  140.       try {
  141.          char[] var4 = new char[65536];
  142.  
  143.          for(int var5 = 0; var5 < 65536; ++var5) {
  144.             var4[var5] = 'ÔøΩ';
  145.          }
  146.  
  147.          byte[] var14 = new byte[(var2 - var1 + 1) * 2];
  148.          char[] var6 = new char[var2 - var1 + 1];
  149.          int var7 = 0;
  150.          if (var0 == 2) {
  151.             for(int var9 = var1; var9 <= var2; ++var9) {
  152.                int var8 = var9 >> 8 & 255;
  153.                if (var8 >= 161 && var8 <= 223) {
  154.                   var14[var7++] = -1;
  155.                   var14[var7++] = -1;
  156.                } else {
  157.                   var14[var7++] = (byte)var8;
  158.                   var14[var7++] = (byte)(var9 & 255);
  159.                }
  160.             }
  161.          } else {
  162.             for(int var18 = var1; var18 <= var2; ++var18) {
  163.                var14[var7++] = (byte)(var18 >> 8 & 255);
  164.                var14[var7++] = (byte)(var18 & 255);
  165.             }
  166.          }
  167.  
  168.          Charset.forName(var3).newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE).replaceWith("\u0000").decode(ByteBuffer.wrap(var14, 0, var14.length), CharBuffer.wrap(var6, 0, var6.length), true);
  169.  
  170.          for(int var19 = 32; var19 <= 126; ++var19) {
  171.             var4[var19] = (char)var19;
  172.          }
  173.  
  174.          if (var0 == 2) {
  175.             for(int var20 = 161; var20 <= 223; ++var20) {
  176.                var4[var20] = (char)(var20 - 161 + 'ÔΩ°');
  177.             }
  178.          }
  179.  
  180.          System.arraycopy(var6, 0, var4, var1, var6.length);
  181.          char[] var21 = new char[65536];
  182.  
  183.          for(int var10 = 0; var10 < 65536; ++var10) {
  184.             if (var4[var10] != 'ÔøΩ') {
  185.                var21[var4[var10]] = (char)var10;
  186.             }
  187.          }
  188.  
  189.          return var21;
  190.       } catch (Exception var11) {
  191.          var11.printStackTrace();
  192.          return null;
  193.       }
  194.    }
  195.  
  196.    static char[] getConverterMap(short var0) {
  197.       if (converterMaps[var0] == null) {
  198.          converterMaps[var0] = getConverter(var0);
  199.       }
  200.  
  201.       return converterMaps[var0];
  202.    }
  203.  
  204.    static CMap createCMap(ByteBuffer var0, int var1, char[] var2) {
  205.       char var3 = var0.getChar(var1);
  206.       long var4;
  207.       if (var3 < '\b') {
  208.          var4 = (long)var0.getChar(var1 + 2);
  209.       } else {
  210.          var4 = (long)(var0.getInt(var1 + 4) & -1);
  211.       }
  212.  
  213.       if ((long)var1 + var4 > (long)var0.capacity() && FontManager.logging) {
  214.          FontManager.logger.warning("Cmap subtable overflows buffer.");
  215.       }
  216.  
  217.       switch (var3) {
  218.          case '\u0000':
  219.             return new CMapFormat0(var0, var1);
  220.          case '\u0001':
  221.          case '\u0003':
  222.          case '\u0005':
  223.          case '\u0007':
  224.          case '\t':
  225.          case '\u000b':
  226.          default:
  227.             throw new RuntimeException("Cmap format unimplemented: " + var0.getChar(var1));
  228.          case '\u0002':
  229.             return new CMapFormat2(var0, var1, var2);
  230.          case '\u0004':
  231.             return new CMapFormat4(var0, var1, var2);
  232.          case '\u0006':
  233.             return new CMapFormat6(var0, var1, var2);
  234.          case '\b':
  235.             return new CMapFormat8(var0, var1, var2);
  236.          case '\n':
  237.             return new CMapFormat10(var0, var1, var2);
  238.          case '\f':
  239.             return new CMapFormat12(var0, var1, var2);
  240.       }
  241.    }
  242.  
  243.    abstract char getGlyph(int var1);
  244.  
  245.    final int getControlCodeGlyph(int var1, boolean var2) {
  246.       if (var1 < 16) {
  247.          switch (var1) {
  248.             case 9:
  249.             case 10:
  250.             case 13:
  251.                return 65535;
  252.             case 11:
  253.             case 12:
  254.          }
  255.       } else if (var1 >= 8204) {
  256.          if (var1 <= 8207 || var1 >= 8232 && var1 <= 8238 || var1 >= 8298 && var1 <= 8303) {
  257.             return 65535;
  258.          }
  259.  
  260.          if (var2 && var1 >= 65535) {
  261.             return 0;
  262.          }
  263.       }
  264.  
  265.       return -1;
  266.    }
  267. }
  268.